From: Keir Fraser Date: Mon, 20 Oct 2008 14:15:19 +0000 (+0100) Subject: Add some necessary files to build IA64 VT-d. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14066^2~24 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks:///%22http:/www.example.com/cgi/%22https:/%22bookmarks:/?a=commitdiff_plain;h=39bd20538e458cd6627eafa40a6378361b464304;p=xen.git Add some necessary files to build IA64 VT-d. Signed-off-by: Anthony Xu Signed-off-by: Dexuan Cui --- diff --git a/xen/drivers/Makefile b/xen/drivers/Makefile index 14c74611ba..eb4fb61554 100644 --- a/xen/drivers/Makefile +++ b/xen/drivers/Makefile @@ -1,6 +1,6 @@ subdir-y += char subdir-y += cpufreq subdir-y += pci -subdir-$(x86) += passthrough +subdir-y += passthrough subdir-$(HAS_ACPI) += acpi subdir-$(HAS_VGA) += video diff --git a/xen/drivers/passthrough/Makefile b/xen/drivers/passthrough/Makefile index fc5e807711..a950881793 100644 --- a/xen/drivers/passthrough/Makefile +++ b/xen/drivers/passthrough/Makefile @@ -1,4 +1,5 @@ subdir-$(x86) += vtd +subdir-$(ia64) += vtd subdir-$(x86) += amd obj-y += iommu.o diff --git a/xen/drivers/passthrough/vtd/Makefile b/xen/drivers/passthrough/vtd/Makefile index 06ee624ae7..0e6f1639df 100644 --- a/xen/drivers/passthrough/vtd/Makefile +++ b/xen/drivers/passthrough/vtd/Makefile @@ -1,4 +1,5 @@ subdir-$(x86) += x86 +subdir-$(ia64) += ia64 obj-y += iommu.o obj-y += dmar.o diff --git a/xen/drivers/passthrough/vtd/ia64/Makefile b/xen/drivers/passthrough/vtd/ia64/Makefile new file mode 100644 index 0000000000..85243e3aa7 --- /dev/null +++ b/xen/drivers/passthrough/vtd/ia64/Makefile @@ -0,0 +1 @@ +obj-y += vtd.o diff --git a/xen/drivers/passthrough/vtd/ia64/vtd.c b/xen/drivers/passthrough/vtd/ia64/vtd.c new file mode 100644 index 0000000000..42e94f7ef5 --- /dev/null +++ b/xen/drivers/passthrough/vtd/ia64/vtd.c @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2008, Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place - Suite 330, Boston, MA 02111-1307 USA. + * + * Copyright (C) Allen Kay + * Copyright (C) Weidong Han + */ + +#include +#include +#include +#include +#include +#include "../iommu.h" +#include "../dmar.h" +#include "../vtd.h" + + +int vector_irq[NR_VECTORS] __read_mostly = { [0 ... NR_VECTORS - 1] = -1}; +/* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */ +u8 irq_vector[NR_IRQ_VECTORS] __read_mostly; + +void *map_vtd_domain_page(u64 maddr) +{ + return (void *)((u64)map_domain_page(maddr >> PAGE_SHIFT) | + (maddr & (PAGE_SIZE - PAGE_SIZE_4K))); +} + +void unmap_vtd_domain_page(void *va) +{ + unmap_domain_page(va); +} + +/* Allocate page table, return its machine address */ +u64 alloc_pgtable_maddr(void) +{ + struct page_info *pg; + u64 *vaddr; + + pg = alloc_domheap_page(NULL, 0); + vaddr = map_domain_page(page_to_mfn(pg)); + if ( !vaddr ) + return 0; + memset(vaddr, 0, PAGE_SIZE); + + iommu_flush_cache_page(vaddr); + unmap_domain_page(vaddr); + + return page_to_maddr(pg); +} + +void free_pgtable_maddr(u64 maddr) +{ + if ( maddr != 0 ) + free_domheap_page(maddr_to_page(maddr)); +} + +unsigned int get_cache_line_size(void) +{ + return L1_CACHE_BYTES; +} + +void cacheline_flush(char * addr) +{ + ia64_fc(addr); + ia64_sync_i(); + ia64_srlz_i(); +} + +void flush_all_cache() +{ + ia64_sal_cache_flush(3); +} + +void * map_to_nocache_virt(int nr_iommus, u64 maddr) +{ + return (void *) ( maddr + __IA64_UNCACHED_OFFSET); +} + +struct hvm_irq_dpci *domain_get_irq_dpci(struct domain *domain) +{ + if ( !domain ) + return NULL; + + return domain->arch.hvm_domain.irq.dpci; +} + +int domain_set_irq_dpci(struct domain *domain, struct hvm_irq_dpci *dpci) +{ + if ( !domain || !dpci ) + return 0; + + domain->arch.hvm_domain.irq.dpci = dpci; + return 1; +} + +void hvm_dpci_isairq_eoi(struct domain *d, unsigned int isairq) +{ + /* dummy */ +}